/* GLOBALS */

uint32 segment_table[]; /* 0x8033b400 */


/* FUNCTIONS */

/* 0x80277ee0 */
uint32 set_segment_base(int segment, void *base)
{
    segment_table[segment] = base & 0x1fffffff;
    return segment_table[segment];
}

/* 0x80277f20 */
void * get_segment_base(int segment)
{
    return (segment_table[segment] | 0x8000000);
}

/* 0x80277f50 */
void * segmented_to_virtual(uint32 addr)
{
    seg = addr >> 24;
    off = addr & 0x00ffffff;

    return (segment_table[seg] + off) | 0x8000000;
}


void * 0x802787d8(int seg, uint32 start, uint32 end)
{
    void *decomp_dst = 0;
    uint32 *size_ptr;

    src_size = (end - start + 15) & 0xfffffff0;
    decomp_src = 0x80278120(src_size, 1);       //seems to be some sort of memory allocation function
    size_ptr = decomp_src + 4;
    if (!decomp_src) {
        return 0;
    }
    0x80278504(decomp_src, start, end);   //seems to copy from ROM
    decomp_dst = 0x80278120(*size_ptr, 0);
    if (!decomp_dst) {
        return 0;
    }
    uncompress(decomp_src, decomp_dst);
    set_segment_base(seg, decomp_dst);
    0x80278238(decomp_src);               //seems to free memory

    return decomp_dst;
}


/* note: a savestate suggests that this function is called with a seg value 0x09 */

void * 0x802788b4(int seg, uint32 start, uint32 end)
{
    v1;
    vois *decomp_src;
    int srcsize;
    v4 = 0;

    srcsize = (end - start + 15) & 0xfffffff0;
    decomp_src = 0x80278120(srcsize, 1);
    v1 = srcsize + 4;
    if (!decomp_src) {
        return 0;
    }
    0x80278504(decomp_src, start, end);
    uncompress(decomp_src, 0x801c1000);
    set_segment_base(seg, 0x801c1000);
    0x80278238(decomp_src);

    return 0x801c1000;
}